NOTE

1.8 TCP time wait

1. 什么是time wait TCP主动关闭连接的一方,最后一个ACK后会进入time wait状态 2. 为什么需要time wait - 应对最后一个ack丢失,需要重传的情况。 - 防止在网络上闲逛的旧连接的数据包被新连接接收 一个连接是由(客户端IP、客户端Port、服务器IP、服务器Port)4元组唯一标识的

计算机网络创建于 更新于 约 2 分钟读完historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. 什么是time wait

TCP主动关闭连接的一方,最后一个ACK后会进入time wait状态

2. 为什么需要time wait

  • 应对最后一个ack丢失,需要重传的情况。
  • 防止在网络上闲逛的旧连接的数据包被新连接接收

    一个连接是由(客户端IP、客户端Port、服务器IP、服务器Port)4元组唯一标识的,连接关闭之后再重开,应该是一个新的连接,但用4元组无法区分出新连接和老连接。这会导致,之前闲逛的数据包在新连接打开后被当作新的数据包,这样一来,老连接上的数据包会“串”到新连接上面,这是不能接受的

3. 为什么time wait的时间设置为2MSL

预备知识:一个包从A到B的时间为RTO,RTO的时间是小于MSL的。 举例来说,客户端为A,服务器为B,A主动关闭了连接。 假设A的ACK包在RTO的最后一刻丢了,此时已经过去了RTO个时间(近似看作是MSL)。B需要重传FIN包,FIN包到达A又需要RTO个时间(近似看作MSL)。 由此可看出一个RTO用于假设ACK最后一刻丢失,另一个MSL用于重传FIN

4. time wait的问题

  • 场景 高并发短连接服务器主动关闭连接,这个时候会有一大堆连接处于time wait状态消耗系统资源,此时新的客户端可能无法连接
  • 原因 网络端口范围0-65535,这些处于time wait状态的连接还是占用着端口 端口范围可以通过以下命令查看:
    cat /proc/sys/net/ipv4/ip_local_port_range 
  • 解决 打开系统的TIMEWAIT重用和快速回收。sysctl改两个内核参数就行了,如下:
    net.ipv4.tcp_tw_reuse = 1 //表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
    net.ipv4.tcp_tw_recycle = 1 //表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭

5. 参考

讨论

使用 GitHub 账号参与讨论,评论会保存在 GitHub Issues 中。在 GitHub 查看